using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeostatisticalAnalystTools._WorkingwithGeostatisticalLayers
{
    /// <summary>
    /// <para>GA Layer To Rasters</para>
    /// <para>Exports a geostatistical layer to one or multiple rasters.</para>
    /// <para>将地统计图层导出到一个或多个栅格。</para>
    /// </summary>    
    [DisplayName("GA Layer To Rasters")]
    public class GALayerToRasters : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GALayerToRasters()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_geostat_layer">
        /// <para>Input geostatistical layer</para>
        /// <para>The geostatistical layer to be analyzed.</para>
        /// <para>要分析的地统计图层。</para>
        /// </param>
        /// <param name="_out_raster">
        /// <para>Output raster</para>
        /// <para>The primary output raster to be created. Additional rasters can be created with the Additional output rasters parameter.</para>
        /// <para>要创建的主要输出栅格。可以使用附加输出栅格参数创建其他栅格。</para>
        /// </param>
        public GALayerToRasters(object _in_geostat_layer, object _out_raster)
        {
            this._in_geostat_layer = _in_geostat_layer;
            this._out_raster = _out_raster;
        }
        public override string ToolboxName => "Geostatistical Analyst Tools";

        public override string ToolName => "GA Layer To Rasters";

        public override string CallName => "ga.GALayerToRasters";

        public override List<string> AcceptEnvironments => ["cellSize", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "parallelProcessingFactor", "scratchWorkspace", "snapRaster", "workspace"];

        public override object[] ParameterInfo => [_in_geostat_layer, _out_raster, _output_type.GetGPValue(), _quantile_probability_value, _cell_size, _points_per_block_horz, _points_per_block_vert, _additional_rasters, _out_additional_rasters, _out_elevation];

        /// <summary>
        /// <para>Input geostatistical layer</para>
        /// <para>The geostatistical layer to be analyzed.</para>
        /// <para>要分析的地统计图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input geostatistical layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_geostat_layer { get; set; }


        /// <summary>
        /// <para>Output raster</para>
        /// <para>The primary output raster to be created. Additional rasters can be created with the Additional output rasters parameter.</para>
        /// <para>要创建的主要输出栅格。可以使用附加输出栅格参数创建其他栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster { get; set; }


        /// <summary>
        /// <para>Output Surface Type</para>
        /// <para><xdoc>
        ///   <para>The surface type of the output raster.</para>
        ///   <para>For more information, see What output surface types can the interpolation models generate?</para>
        ///   <bulletList>
        ///     <bullet_item>Prediction—A raster of predicted values.</bullet_item><para/>
        ///     <bullet_item>Prediction standard error—A raster of standard errors of prediction.</bullet_item><para/>
        ///     <bullet_item>Probability—A raster predicting the probability that a threshold is exceeded.</bullet_item><para/>
        ///     <bullet_item>Quantile—A raster predicting the quantile of the predicted value.</bullet_item><para/>
        ///     <bullet_item>Standard error of indicators—A raster of standard errors of indicators.</bullet_item><para/>
        ///     <bullet_item>Condition number—A raster showing the condition number for predictions in Local Polynomial Interpolation. The condition number surface indicates the stability of calculations at a particular location. The larger the condition number, the more unstable the prediction, so locations with large condition numbers may be prone to artifacts and erratic predicted values.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出栅格的表面类型。</para>
        ///   <para>有关详细信息，请参阅插值模型可以生成哪些输出曲面类型？</para>
        ///   <bulletList>
        ///     <bullet_item>预测 - 预测值的栅格。</bullet_item><para/>
        ///     <bullet_item>预测标准误差 - 预测标准误差的栅格。</bullet_item><para/>
        ///     <bullet_item>概率 - 预测超过阈值的概率的栅格。</bullet_item><para/>
        ///     <bullet_item>分位数 - 预测预测值分位数的栅格。</bullet_item><para/>
        ///     <bullet_item>指标标准误差 - 指标标准误差的栅格。</bullet_item><para/>
        ///     <bullet_item>条件编号 - 在局部多项式插值中显示预测条件编号的栅格。条件编号图面指示特定位置计算的稳定性。条件编号越大，预测越不稳定，因此条件编号较大的位置可能容易出现伪影和预测值不稳定的情况。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Surface Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _output_type_value _output_type { get; set; } = _output_type_value._PREDICTION;

        public enum _output_type_value
        {
            /// <summary>
            /// <para>Prediction</para>
            /// <para>Prediction—A raster of predicted values.</para>
            /// <para>预测 - 预测值的栅格。</para>
            /// </summary>
            [Description("Prediction")]
            [GPEnumValue("PREDICTION")]
            _PREDICTION,

            /// <summary>
            /// <para>Prediction standard error</para>
            /// <para>Prediction standard error—A raster of standard errors of prediction.</para>
            /// <para>预测标准误差 - 预测标准误差的栅格。</para>
            /// </summary>
            [Description("Prediction standard error")]
            [GPEnumValue("PREDICTION_STANDARD_ERROR")]
            _PREDICTION_STANDARD_ERROR,

            /// <summary>
            /// <para>Probability</para>
            /// <para>Probability—A raster predicting the probability that a threshold is exceeded.</para>
            /// <para>概率 - 预测超过阈值的概率的栅格。</para>
            /// </summary>
            [Description("Probability")]
            [GPEnumValue("PROBABILITY")]
            _PROBABILITY,

            /// <summary>
            /// <para>Quantile</para>
            /// <para>Quantile—A raster predicting the quantile of the predicted value.</para>
            /// <para>分位数 - 预测预测值分位数的栅格。</para>
            /// </summary>
            [Description("Quantile")]
            [GPEnumValue("QUANTILE")]
            _QUANTILE,

            /// <summary>
            /// <para>Condition number</para>
            /// <para>Condition number—A raster showing the condition number for predictions in Local Polynomial Interpolation. The condition number surface indicates the stability of calculations at a particular location. The larger the condition number, the more unstable the prediction, so locations with large condition numbers may be prone to artifacts and erratic predicted values.</para>
            /// <para>条件编号 - 在局部多项式插值中显示预测条件编号的栅格。条件编号图面指示特定位置计算的稳定性。条件编号越大，预测越不稳定，因此条件编号较大的位置可能容易出现伪影和预测值不稳定的情况。</para>
            /// </summary>
            [Description("Condition number")]
            [GPEnumValue("CONDITION_NUMBER")]
            _CONDITION_NUMBER,

            /// <summary>
            /// <para>Standard error of indicators</para>
            /// <para>Standard error of indicators—A raster of standard errors of indicators.</para>
            /// <para>指标标准误差 - 指标标准误差的栅格。</para>
            /// </summary>
            [Description("Standard error of indicators")]
            [GPEnumValue("STANDARD_ERROR_INDICATORS")]
            _STANDARD_ERROR_INDICATORS,

        }

        /// <summary>
        /// <para>Quantile or probability value</para>
        /// <para><xdoc>
        ///   <para>If the Output surface type is set to Quantile, use this parameter to enter the requested quantile. If the Output surface type is set to Probability, use this parameter to enter the requested threshold value, then the probability that the threshold is exceeded will be calculated.</para>
        ///   <para>If the Input geostatistical layer is a probability or standard errors of indicators map that was created with the Not exceed option, then the probability that this threshold is not exceeded will be calculated. This will apply to all probability raster outputs from this tool.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>如果输出曲面类型设置为分位数，则使用此参数输入请求的分位数。如果输出曲面类型设置为概率，则使用此参数输入请求的阈值，则计算超过阈值的概率。</para>
        ///   <para>如果输入地统计图层是使用 Not exceed 选项创建的指标的概率或标准误差地图，则将计算未超过此阈值的概率。这将适用于此工具的所有概率栅格输出。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Quantile or probability value")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _quantile_probability_value { get; set; } = null;


        /// <summary>
        /// <para>Output cell size</para>
        /// <para>The cell size of the output rasters. This value will be shared by the Output raster and the Additional output rasters parameters.</para>
        /// <para>输出栅格的像元大小。此值将由输出栅格和附加输出栅格参数共享。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output cell size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _cell_size { get; set; } = null;


        /// <summary>
        /// <para>Number of points in the cell (horizontal)</para>
        /// <para>The number of predictions for each cell in the horizontal direction for block interpolation.</para>
        /// <para>用于块插值的水平方向上每个像元的预测数。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Number of points in the cell (horizontal)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _points_per_block_horz { get; set; } = 1;


        /// <summary>
        /// <para>Number of points in the cell (vertical)</para>
        /// <para>The number of predictions for each cell in the vertical direction for block interpolation.</para>
        /// <para>每个像元在垂直方向上的预测数，用于块插值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Number of points in the cell (vertical)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long _points_per_block_vert { get; set; } = 1;


        /// <summary>
        /// <para>Additional output rasters</para>
        /// <para>Provide the name, output type, and quantile or probability value for each additional output raster. See the descriptions of parameters above for more information. These additional rasters will be saved in the same location as the Output raster.</para>
        /// <para>为每个附加输出栅格提供名称、输出类型以及分位数或概率值。有关详细信息，请参阅上面的参数说明。这些附加栅格将保存在与输出栅格相同的位置。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Additional output rasters")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _additional_rasters { get; set; } = null;


        /// <summary>
        /// <para>Additional rasters</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Additional rasters")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public List<object> _out_additional_rasters { get; set; }


        /// <summary>
        /// <para>Output elevation</para>
        /// <para>For 3D interpolation models, you can export rasters at any elevation. Use this parameter to specify the elevation you want to export. If left empty, the elevation will be inherited from the input layer. The units will default to the same units of the input layer.</para>
        /// <para>对于三维插值模型，可以导出任意高程的栅格。使用此参数指定要导出的高程。如果留空，则高程将从输入图层继承。这些单位将默认为输入图层的相同单位。</para>
        /// <para>单位： Inches | Feet | Yards | Miles | NauticalMiles | Millimeters | Centimeters | Decimeters | Meters | Kilometers </para>
        /// </summary>
        [DisplayName("Output elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _out_elevation { get; set; } = null;


        public GALayerToRasters SetEnv(object cellSize = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object scratchWorkspace = null, object snapRaster = null, object workspace = null)
        {
            base.SetEnv(cellSize: cellSize, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, workspace: workspace);
            return this;
        }

    }

}